package com.supermarket.util;

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.Date;

/**
 * 过期状态计算工具类
 * 负责计算商品的过期日期、剩余天数和过期状态
 */
public class ExpiryCalculationUtil {
    
    // 过期状态常量
    public static final String STATUS_EXPIRED = "已过期";
    public static final String STATUS_EXPIRING_SOON = "即将过期";
    public static final String STATUS_NEAR_EXPIRY = "临期商品";
    public static final String STATUS_APPROACHING_EXPIRY = "即将临期";
    public static final String STATUS_NORMAL = "正常";
    public static final String STATUS_INCOMPLETE_INFO = "信息不完整";
    
    // 过期状态阈值（天数）
    public static final int EXPIRING_SOON_THRESHOLD = 3;
    public static final int NEAR_EXPIRY_THRESHOLD = 7;
    public static final int APPROACHING_EXPIRY_THRESHOLD = 30;
    
    /**
     * 根据出厂日期和保质期天数计算过期日期
     * 
     * @param productionDate 出厂日期
     * @param shelfLifeDays 保质期天数
     * @return 过期日期，如果输入参数无效则返回null
     */
    public static Date calculateExpiryDate(Date productionDate, Integer shelfLifeDays) {
        // 边界条件检查
        if (productionDate == null || shelfLifeDays == null || shelfLifeDays <= 0) {
            return null;
        }
        
        try {
            // 将Date转换为LocalDate进行计算
            LocalDate productionLocalDate = convertToLocalDate(productionDate);
            LocalDate expiryLocalDate = productionLocalDate.plusDays(shelfLifeDays);
            
            // 转换回Date类型
            return java.sql.Date.valueOf(expiryLocalDate);
        } catch (Exception e) {
            // 处理日期转换异常
            System.err.println("计算过期日期时发生错误: " + e.getMessage());
            return null;
        }
    }
    
    /**
     * 计算剩余天数
     * 
     * @param expiryDate 过期日期
     * @return 剩余天数，正数表示未过期，负数表示已过期，null表示计算失败
     */
    public static Long calculateRemainingDays(Date expiryDate) {
        // 空值检查
        if (expiryDate == null) {
            return null;
        }
        
        try {
            LocalDate expiryLocalDate = convertToLocalDate(expiryDate);
            LocalDate currentDate = LocalDate.now();
            
            // 计算剩余天数：过期日期 - 当前日期
            return ChronoUnit.DAYS.between(currentDate, expiryLocalDate);
        } catch (Exception e) {
            // 处理日期转换异常
            System.err.println("计算剩余天数时发生错误: " + e.getMessage());
            return null;
        }
    }
    
    /**
     * 根据剩余天数判断过期状态
     * 
     * @param remainingDays 剩余天数
     * @return 过期状态字符串
     */
    public static String determineExpiryStatus(Long remainingDays) {
        // 空值检查
        if (remainingDays == null) {
            return STATUS_INCOMPLETE_INFO;
        }
        
        // 根据剩余天数判断过期状态
        if (remainingDays <= 0) {
            return STATUS_EXPIRED;
        } else if (remainingDays <= EXPIRING_SOON_THRESHOLD) {
            return STATUS_EXPIRING_SOON;
        } else if (remainingDays <= NEAR_EXPIRY_THRESHOLD) {
            return STATUS_NEAR_EXPIRY;
        } else if (remainingDays <= APPROACHING_EXPIRY_THRESHOLD) {
            return STATUS_APPROACHING_EXPIRY;
        } else {
            return STATUS_NORMAL;
        }
    }
    
    /**
     * 综合计算方法：根据出厂日期和保质期直接计算过期状态
     * 
     * @param productionDate 出厂日期
     * @param shelfLifeDays 保质期天数
     * @return 过期状态字符串
     */
    public static String calculateExpiryStatus(Date productionDate, Integer shelfLifeDays) {
        // 边界条件检查
        if (productionDate == null || shelfLifeDays == null) {
            return STATUS_INCOMPLETE_INFO;
        }
        
        // 计算过期日期
        Date expiryDate = calculateExpiryDate(productionDate, shelfLifeDays);
        if (expiryDate == null) {
            return STATUS_INCOMPLETE_INFO;
        }
        
        // 计算剩余天数
        Long remainingDays = calculateRemainingDays(expiryDate);
        
        // 判断过期状态
        return determineExpiryStatus(remainingDays);
    }
    
    /**
     * 检查商品是否已过期
     * 
     * @param productionDate 出厂日期
     * @param shelfLifeDays 保质期天数
     * @return true表示已过期，false表示未过期
     */
    public static boolean isExpired(Date productionDate, Integer shelfLifeDays) {
        String status = calculateExpiryStatus(productionDate, shelfLifeDays);
        return STATUS_EXPIRED.equals(status);
    }
    
    /**
     * 检查商品是否为临期商品（包括即将过期和临期商品）
     * 
     * @param productionDate 出厂日期
     * @param shelfLifeDays 保质期天数
     * @return true表示是临期商品，false表示不是
     */
    public static boolean isNearExpiry(Date productionDate, Integer shelfLifeDays) {
        String status = calculateExpiryStatus(productionDate, shelfLifeDays);
        return STATUS_EXPIRING_SOON.equals(status) || STATUS_NEAR_EXPIRY.equals(status);
    }
    
    /**
     * 获取过期状态对应的颜色代码（用于UI显示）
     * 
     * @param expiryStatus 过期状态
     * @return 颜色代码字符串
     */
    public static String getStatusColor(String expiryStatus) {
        if (expiryStatus == null) {
            return "#FFFFFF"; // 白色 - 默认
        }
        
        switch (expiryStatus) {
            case STATUS_EXPIRED:
                return "#ffebee"; // 红色背景
            case STATUS_EXPIRING_SOON:
                return "#fff3e0"; // 橙色背景
            case STATUS_NEAR_EXPIRY:
                return "#fffde7"; // 黄色背景
            case STATUS_APPROACHING_EXPIRY:
                return "#e3f2fd"; // 浅蓝色背景
            case STATUS_NORMAL:
                return "#FFFFFF"; // 白色背景
            case STATUS_INCOMPLETE_INFO:
                return "#f5f5f5"; // 灰色背景
            default:
                return "#FFFFFF"; // 白色 - 默认
        }
    }
    
    /**
     * 将Date对象转换为LocalDate
     * 
     * @param date Date对象
     * @return LocalDate对象
     */
    private static LocalDate convertToLocalDate(Date date) {
        if (date instanceof java.sql.Date) {
            return ((java.sql.Date) date).toLocalDate();
        } else {
            return date.toInstant()
                      .atZone(java.time.ZoneId.systemDefault())
                      .toLocalDate();
        }
    }
    
    /**
     * 格式化剩余天数显示
     * 
     * @param remainingDays 剩余天数
     * @return 格式化的字符串
     */
    public static String formatRemainingDays(Long remainingDays) {
        if (remainingDays == null) {
            return "未知";
        }
        
        if (remainingDays < 0) {
            return "已过期" + Math.abs(remainingDays) + "天";
        } else if (remainingDays == 0) {
            return "今天过期";
        } else {
            return "剩余" + remainingDays + "天";
        }
    }
    
    /**
     * 验证输入参数的有效性
     * 
     * @param productionDate 出厂日期
     * @param shelfLifeDays 保质期天数
     * @return 验证结果消息，null表示验证通过
     */
    public static String validateInputs(Date productionDate, Integer shelfLifeDays) {
        if (productionDate == null) {
            return "出厂日期不能为空";
        }
        
        if (shelfLifeDays == null) {
            return "保质期天数不能为空";
        }
        
        if (shelfLifeDays <= 0) {
            return "保质期天数必须大于0";
        }
        
        // 检查出厂日期是否在未来
        LocalDate productionLocalDate = convertToLocalDate(productionDate);
        LocalDate currentDate = LocalDate.now();
        if (productionLocalDate.isAfter(currentDate)) {
            return "出厂日期不能是未来日期";
        }
        
        // 检查出厂日期是否过于久远（超过10年）
        if (ChronoUnit.YEARS.between(productionLocalDate, currentDate) > 10) {
            return "出厂日期过于久远，请检查数据";
        }
        
        return null; // 验证通过
    }
}